//
//  Nure.m
//  demo
//
//  Created by chenzm on 2018/8/17.
//  Copyright © 2018年 chenzm. All rights reserved.
//

#import "Nure.h"


@implementation Nure{
    Chidren *_children;
}
static NSInteger isGo = 0;

#pragma mark - initial

- (id) initWithChildren:(Chidren *)children{
    self = [super init];
    if(self != nil){
        _children = children;
        isGo = 0;
        [self addKVO];
    }
    return self;
}

///添加KVO观察者
-(void)addKVO{
    //观察小孩的hapyValue
    //使用KVO为_children对象添加一个观察者，用于观察监听hapyValue属性值是否被修改
    [_children addObserver:self forKeyPath:@"hapyValue" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"hapyValue"];
    
    //观察小孩的hurryValue
    [_children addObserver:self forKeyPath:@"hurryValue" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"hurryValue"];
}

#pragma mark - NSKeyValueObserving
/**
 触发方法:当属性值发生变化的时候，这个方法会被回调

 @param keyPath 键值路径
 @param object 监听对象
 @param change 变化的值
 @param context 传递的内容
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    //通过打印change，我们可以看到对应的key
    NSLog(@"%@:%@",context,change);
    
    //通过keyPath来判断不同属性的观察者
    if([keyPath isEqualToString:@"hapyValue"]){
        //这里change中有old和new的值是因为我们在调用addObserver方法时，用到了
        //NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld；想要哪一个就用哪一个
        //[change objectForKey:@"old"]是修改前的值
        NSNumber *hapyValue = [change objectForKey:@"new"];//修改之后的最新值
        
        NSInteger value = [hapyValue integerValue];
        
        if(value < 90){
            [_children deallocTimer];
            if (isGo == 0) {
                isGo = 1;
                NSLog(@"休息一下");
                sleep(5);
            }
            [_children addTimer];
        }
    }else if([keyPath isEqualToString:@"hurryValue"]){
        //这里change中有old和new的值是因为我们在调用addObserver方法时，用到了
        //NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld；想要哪一个就用哪一个
        //[change objectForKey:@"old"]是修改前的值
        NSNumber *hurryValue = [change objectForKey:@"new"];//修改之后的最新值
        
        NSInteger value = [hurryValue integerValue];
        
        if(value < -30){
            //do something...
            NSLog(@"退出循环");
            [_children deallocTimer];
        }
    }
    
    //使用KVC去修改属性的值，也会触发事件
}

- (void)dealloc{
    //移除观察者
    [_children removeObserver:self forKeyPath:@"hapyValue"];
    [_children removeObserver:self forKeyPath:@"hurryValue"];
}

@end
